import socket
import struct
import sys
from datetime import datetime

def ntp_server():
    # 从命令行参数获取时间字符串，格式为"2019-05-01 10:41:00"
    if len(sys.argv) != 2:
        print("用法：python ntp_server.py '2019-05-01 10:41:00'")
        sys.exit(1)
    time_str = sys.argv[1]
    # 将时间字符串转换为时间戳（NTP时间从1900年开始，需调整）
    dt = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S")
    ntp_epoch = datetime(1900, 1, 1)
    timestamp = (dt - ntp_epoch).total_seconds()
    # 构造NTP响应包（简化版，仅满足Windows客户端基本需求）
    ntp_packet = struct.pack('!B B B B I I I I I I',
                             0b00100011,  # 版本3，服务器模式
                             0, 0, 0,     # 剩余字段设为0
                             0, 0,        # 根延迟和根色散
                             0,           # 参考ID
                             int(timestamp),  # 参考时间戳（秒）
                             0,              # 参考时间戳（小数秒）
                             int(timestamp),  # 接收时间戳（秒）
                             0,              # 接收时间戳（小数秒）
                             int(timestamp),  # 发送时间戳（秒）
                             0)              # 发送时间戳（小数秒）
    # 创建UDP套接字，绑定123端口（NTP默认端口）
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
        s.bind(('localhost', 123))
        print("NTP服务器已启动，监听localhost:123...")
        while True:
            data, addr = s.recvfrom(1024)
            s.sendto(ntp_packet, addr)
            print(f"已向{addr}发送时间响应")

if __name__ == "__main__":
    ntp_server()